package com.nightsoul.shirotest.permission;

import org.apache.shiro.authz.Permission;
import org.apache.shiro.util.StringUtils;

public class BitPermission implements Permission {
	private String resourceId;
	private int permissionBit;
	private String instanceId;

	public BitPermission(String permissionString) {
		String[] array = permissionString.split("\\+");
		if(array.length > 1) {
			resourceId = array[1];
		}

		if(!StringUtils.hasText(resourceId)) {
			resourceId = "*";
		}

		if(array.length > 2) {
			permissionBit = Integer.valueOf(array[2]);
		}
		if(array.length > 3) {
			instanceId = array[3];
		}

		if(!StringUtils.hasText(instanceId)) {
			instanceId = "*";
		}
	}

	@Override
	public boolean implies(Permission p) {
		if(!(p instanceof BitPermission)) {
			return false;
		}

		BitPermission other = (BitPermission) p;
		if(!("*".equals(resourceId) || this.resourceId.equals(other.resourceId))) {
			return false;
		}

		if(!(this.permissionBit == 0 || (this.permissionBit & other.permissionBit) != 0)) {
			return false;
		}

		if(!("*".equals(instanceId) || this.instanceId.equals(other.instanceId))) {
			return false;
		}

		return true;
	}

}
